home *** CD-ROM | disk | FTP | other *** search
/ CU Amiga Super CD-ROM 19 / CU Amiga Magazine's Super CD-ROM 19 (1998)(EMAP Images)(GB)[!][issue 1998-02].iso / OpenBSD / comp21.tar.gz / comp21.tar / usr / include / netinet / if_ether.h < prev    next >
C/C++ Source or Header  |  1996-07-29  |  9KB  |  260 lines

  1. /*    $OpenBSD: if_ether.h,v 1.5 1996/07/27 11:06:42 deraadt Exp $    */
  2. /*    $NetBSD: if_ether.h,v 1.22 1996/05/11 13:00:00 mycroft Exp $    */
  3.  
  4. /*
  5.  * Copyright (c) 1982, 1986, 1993
  6.  *    The Regents of the University of California.  All rights reserved.
  7.  *
  8.  * Redistribution and use in source and binary forms, with or without
  9.  * modification, are permitted provided that the following conditions
  10.  * are met:
  11.  * 1. Redistributions of source code must retain the above copyright
  12.  *    notice, this list of conditions and the following disclaimer.
  13.  * 2. Redistributions in binary form must reproduce the above copyright
  14.  *    notice, this list of conditions and the following disclaimer in the
  15.  *    documentation and/or other materials provided with the distribution.
  16.  * 3. All advertising materials mentioning features or use of this software
  17.  *    must display the following acknowledgement:
  18.  *    This product includes software developed by the University of
  19.  *    California, Berkeley and its contributors.
  20.  * 4. Neither the name of the University nor the names of its contributors
  21.  *    may be used to endorse or promote products derived from this software
  22.  *    without specific prior written permission.
  23.  *
  24.  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
  25.  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  26.  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  27.  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  28.  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  29.  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  30.  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  31.  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  32.  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  33.  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  34.  * SUCH DAMAGE.
  35.  *
  36.  *    @(#)if_ether.h    8.1 (Berkeley) 6/10/93
  37.  */
  38.  
  39. /*
  40.  * Ethernet address - 6 octets
  41.  * this is only used by the ethers(3) functions.
  42.  */
  43. struct ether_addr {
  44.     u_int8_t ether_addr_octet[6];
  45. };
  46.  
  47. /*
  48.  * Structure of a 10Mb/s Ethernet header.
  49.  */
  50. #define    ETHER_ADDR_LEN    6
  51.  
  52. struct    ether_header {
  53.     u_int8_t  ether_dhost[ETHER_ADDR_LEN];
  54.     u_int8_t  ether_shost[ETHER_ADDR_LEN];
  55.     u_int16_t ether_type;
  56. };
  57.  
  58. #define    ETHERTYPE_PUP        0x0200    /* PUP protocol */
  59. #define    ETHERTYPE_IP        0x0800    /* IP protocol */
  60. #define    ETHERTYPE_ARP        0x0806    /* address resolution protocol */
  61. #define    ETHERTYPE_REVARP    0x8035    /* reverse addr resolution protocol */
  62.  
  63. /*
  64.  * The ETHERTYPE_NTRAILER packet types starting at ETHERTYPE_TRAIL have
  65.  * (type-ETHERTYPE_TRAIL)*512 bytes of data followed
  66.  * by an ETHER type (as given above) and then the (variable-length) header.
  67.  */
  68. #define    ETHERTYPE_TRAIL        0x1000        /* Trailer packet */
  69. #define    ETHERTYPE_NTRAILER    16
  70.  
  71. #define    ETHER_IS_MULTICAST(addr) (*(addr) & 0x01) /* is address mcast/bcast? */
  72.  
  73. #define    ETHERMTU    1500
  74. #define    ETHERMIN    (60-14)
  75.  
  76. #ifdef _KERNEL
  77. /*
  78.  * Macro to map an IP multicast address to an Ethernet multicast address.
  79.  * The high-order 25 bits of the Ethernet address are statically assigned,
  80.  * and the low-order 23 bits are taken from the low end of the IP address.
  81.  */
  82. #define ETHER_MAP_IP_MULTICAST(ipaddr, enaddr)                \
  83.     /* struct in_addr *ipaddr; */                    \
  84.     /* u_int8_t enaddr[ETHER_ADDR_LEN]; */                \
  85. {                                    \
  86.     (enaddr)[0] = 0x01;                        \
  87.     (enaddr)[1] = 0x00;                        \
  88.     (enaddr)[2] = 0x5e;                        \
  89.     (enaddr)[3] = ((u_int8_t *)ipaddr)[1] & 0x7f;            \
  90.     (enaddr)[4] = ((u_int8_t *)ipaddr)[2];                \
  91.     (enaddr)[5] = ((u_int8_t *)ipaddr)[3];                \
  92. }
  93. #endif
  94.  
  95. /*
  96.  * Ethernet Address Resolution Protocol.
  97.  *
  98.  * See RFC 826 for protocol description.  Structure below is adapted
  99.  * to resolving internet addresses.  Field names used correspond to 
  100.  * RFC 826.
  101.  */
  102. struct    ether_arp {
  103.     struct     arphdr ea_hdr;            /* fixed-size header */
  104.     u_int8_t arp_sha[ETHER_ADDR_LEN];    /* sender hardware address */
  105.     u_int8_t arp_spa[4];            /* sender protocol address */
  106.     u_int8_t arp_tha[ETHER_ADDR_LEN];    /* target hardware address */
  107.     u_int8_t arp_tpa[4];            /* target protocol address */
  108. };
  109. #define    arp_hrd    ea_hdr.ar_hrd
  110. #define    arp_pro    ea_hdr.ar_pro
  111. #define    arp_hln    ea_hdr.ar_hln
  112. #define    arp_pln    ea_hdr.ar_pln
  113. #define    arp_op    ea_hdr.ar_op
  114.  
  115. /*
  116.  * Structure shared between the ethernet driver modules and
  117.  * the address resolution code.  For example, each ec_softc or il_softc
  118.  * begins with this structure.
  119.  */
  120. struct    arpcom {
  121.     struct     ifnet ac_if;            /* network-visible interface */
  122.     u_int8_t ac_enaddr[ETHER_ADDR_LEN];    /* ethernet hardware address */
  123.     char     ac__pad[2];            /* pad for some machines */
  124.     LIST_HEAD(, ether_multi) ac_multiaddrs;    /* list of ether multicast addrs */
  125.     int     ac_multicnt;            /* length of ac_multiaddrs list */
  126. };
  127.  
  128. struct llinfo_arp {
  129.     LIST_ENTRY(llinfo_arp) la_list;
  130.     struct    rtentry *la_rt;
  131.     struct    mbuf *la_hold;        /* last packet until resolved/timeout */
  132.     long    la_asked;        /* last time we QUERIED for this addr */
  133. #define la_timer la_rt->rt_rmx.rmx_expire /* deletion time in seconds */
  134. };
  135.  
  136. struct sockaddr_inarp {
  137.     u_int8_t  sin_len;
  138.     u_int8_t  sin_family;
  139.     u_int16_t sin_port;
  140.     struct      in_addr sin_addr;
  141.     struct      in_addr sin_srcaddr;
  142.     u_int16_t sin_tos;
  143.     u_int16_t sin_other;
  144. #define SIN_PROXY 1
  145. };
  146.  
  147. /*
  148.  * IP and ethernet specific routing flags
  149.  */
  150. #define    RTF_USETRAILERS    RTF_PROTO1    /* use trailers */
  151. #define    RTF_ANNOUNCE    RTF_PROTO2    /* announce new arp entry */
  152.  
  153. #ifdef    _KERNEL
  154. u_int8_t etherbroadcastaddr[ETHER_ADDR_LEN];
  155. u_int8_t ether_ipmulticast_min[ETHER_ADDR_LEN];
  156. u_int8_t ether_ipmulticast_max[ETHER_ADDR_LEN];
  157. struct    ifqueue arpintrq;
  158.  
  159. void    arpwhohas __P((struct arpcom *, struct in_addr *));
  160. void    arpintr __P((void));
  161. int    arpresolve __P((struct arpcom *,
  162.         struct rtentry *, struct mbuf *, struct sockaddr *, u_char *));
  163. void    arp_ifinit __P((struct arpcom *, struct ifaddr *));
  164. void    arp_rtrequest __P((int, struct rtentry *, struct sockaddr *));
  165.  
  166. int    ether_addmulti __P((struct ifreq *, struct arpcom *));
  167. int    ether_delmulti __P((struct ifreq *, struct arpcom *));
  168. #endif /* _KERNEL */
  169.  
  170. /*
  171.  * Ethernet multicast address structure.  There is one of these for each
  172.  * multicast address or range of multicast addresses that we are supposed
  173.  * to listen to on a particular interface.  They are kept in a linked list,
  174.  * rooted in the interface's arpcom structure.  (This really has nothing to
  175.  * do with ARP, or with the Internet address family, but this appears to be
  176.  * the minimally-disrupting place to put it.)
  177.  */
  178. struct ether_multi {
  179.     u_int8_t enm_addrlo[ETHER_ADDR_LEN]; /* low  or only address of range */
  180.     u_int8_t enm_addrhi[ETHER_ADDR_LEN]; /* high or only address of range */
  181.     struct     arpcom *enm_ac;    /* back pointer to arpcom */
  182.     u_int     enm_refcount;        /* no. claims to this addr/range */
  183.     LIST_ENTRY(ether_multi) enm_list;
  184. };
  185.  
  186. /*
  187.  * Structure used by macros below to remember position when stepping through
  188.  * all of the ether_multi records.
  189.  */
  190. struct ether_multistep {
  191.     struct ether_multi  *e_enm;
  192. };
  193.  
  194. /*
  195.  * Macro for looking up the ether_multi record for a given range of Ethernet
  196.  * multicast addresses connected to a given arpcom structure.  If no matching
  197.  * record is found, "enm" returns NULL.
  198.  */
  199. #define ETHER_LOOKUP_MULTI(addrlo, addrhi, ac, enm)            \
  200.     /* u_int8_t addrlo[ETHER_ADDR_LEN]; */                \
  201.     /* u_int8_t addrhi[ETHER_ADDR_LEN]; */                \
  202.     /* struct arpcom *ac; */                    \
  203.     /* struct ether_multi *enm; */                    \
  204. {                                    \
  205.     for ((enm) = (ac)->ac_multiaddrs.lh_first;            \
  206.         (enm) != NULL &&                        \
  207.         (bcmp((enm)->enm_addrlo, (addrlo), ETHER_ADDR_LEN) != 0 ||    \
  208.          bcmp((enm)->enm_addrhi, (addrhi), ETHER_ADDR_LEN) != 0);    \
  209.         (enm) = (enm)->enm_list.le_next);            \
  210. }
  211.  
  212. /*
  213.  * Macro to step through all of the ether_multi records, one at a time.
  214.  * The current position is remembered in "step", which the caller must
  215.  * provide.  ETHER_FIRST_MULTI(), below, must be called to initialize "step"
  216.  * and get the first record.  Both macros return a NULL "enm" when there
  217.  * are no remaining records.
  218.  */
  219. #define ETHER_NEXT_MULTI(step, enm) \
  220.     /* struct ether_multistep step; */  \
  221.     /* struct ether_multi *enm; */  \
  222. { \
  223.     if (((enm) = (step).e_enm) != NULL) \
  224.         (step).e_enm = (enm)->enm_list.le_next; \
  225. }
  226.  
  227. #define ETHER_FIRST_MULTI(step, ac, enm) \
  228.     /* struct ether_multistep step; */ \
  229.     /* struct arpcom *ac; */ \
  230.     /* struct ether_multi *enm; */ \
  231. { \
  232.     (step).e_enm = (ac)->ac_multiaddrs.lh_first; \
  233.     ETHER_NEXT_MULTI((step), (enm)); \
  234. }
  235.  
  236. #ifdef _KERNEL
  237.  
  238. void arp_rtrequest __P((int, struct rtentry *, struct sockaddr *));
  239. int arpresolve __P((struct arpcom *, struct rtentry *, struct mbuf *,
  240.             struct sockaddr *, u_char *));
  241. void arpintr __P((void));
  242. int arpioctl __P((u_long, caddr_t));
  243. void arp_ifinit __P((struct arpcom *, struct ifaddr *));
  244. void revarpinput __P((struct mbuf *));
  245. void in_revarpinput __P((struct mbuf *));
  246. void revarprequest __P((struct ifnet *));
  247. int revarpwhoarewe __P((struct ifnet *, struct in_addr *, struct in_addr *));
  248. int revarpwhoami __P((struct in_addr *, struct ifnet *));
  249. int db_show_arptab __P((void));
  250.  
  251. #else
  252.  
  253. char *ether_ntoa __P((struct ether_addr *));
  254. struct ether_addr *ether_aton __P((char *));
  255. int ether_ntohost __P((char *, struct ether_addr *));
  256. int ether_hostton __P((char *, struct ether_addr *));
  257. int ether_line __P((char *, struct ether_addr *, char *));
  258.  
  259. #endif
  260.